﻿
/////////////////////////////////////////////////////////////////
//File: CategoryHandler.cs
//Description: 这是安全控制器，使用代理模式。只有需要授权的数据才从这里读取，非授权数据请直接调用服务类。
//             CRUD授权过程：1. C,U操作要检查输入的数据是否符合授权。
//                          2. R操作要先读出目标数据，然后检查数据是否符合授权。
//                          3. D操作要先进行R操作过滤，判断输入数据是否符合授权，然后只执行符合授权的删除，忽略不符合授权的操作。
//                             为了保存程序的简洁和数据库执行效率，R过滤可以在Sql中完成。
//             
//Copyright© 2011 Moliu
//History:
//  2011-3-21 23:35:08    CodeSmith5.0.1    Original Version
//  2011-3-22 23:04:35    MoLiu             1
/////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.Security;
using System.Threading;
using MAF.Common;
using My.Blog.Domain.Entities;
using My.Blog.Domain.Interfaces;

namespace My.Blog.Business.Security
{
    public partial class CategorySafe : ICategory
    {
        // 构造函数
        public CategorySafe(ICategory thisObj)
        {
            _This = thisObj;
        }
        
        #region ICategory成员
        
        /// <summary>
        /// Create
        /// 允许角色：
        ///     管理员
        ///     博主
        /// </summary>
        /// <param name="info">
        /// info.BlogId
        /// </param>
        /// <returns></returns>
        public  object CreateCategory(CategoryInfo info )
        {
            // 权限判断
            if (SecurityUtility.IsBlogAdmin)
            {
                ;
            }
            if (SecurityUtility.IsBlogMaster(info.BlogId.ToString()))
            { 
                if( 0==info.ParentId)
                    throw new SecurityException("无法在此层次上添加目录，权限不足");   
            }
            else
            { throw new SecurityException("权限不足"); }
            
            return _This.CreateCategory(info);
        }
        
        // Update
        // 允许角色：
        //     管理员
        //     博主
        public int UpdateCategory(CategoryInfo info )
        {
            // 权限判断
            if (SecurityUtility.IsBlogAdmin)
            { ;   }
            else
            { info.BlogId = int.Parse(SecurityUtility.UserId); }
            
            return _This.UpdateCategory(info);
        }
        
        // Delete
        // 允许角色：
        //     管理员
        //     博主
        public int DeleteCategories(CategoryInfo info )
        {
            // 权限判断
            if (SecurityUtility.IsBlogAdmin)
            {   ;   }
            else
            { info.BlogId = int.Parse(SecurityUtility.UserId); }
            
            return _This.DeleteCategories(info);
        }
        
        // Detail
        // 允许角色：
        //     管理员--全部
        //     博客--全部
        //     其他人--公开的
        public CategoryInfo ReadCategoryByConditions(CategoryInfo info)
        {
            info = _This.ReadCategoryByConditions(info);

            // 权限判断
            if (SecurityUtility.UserId == info.BlogId.ToString()
             || SecurityUtility.IsInRole(""))
            { ;   }
            else if (!info.IsPublished)
            { throw new SecurityException("权限不足"); }

            return info;
        }
        
        // List
        // 允许角色：
        //     管理员--全部
        //     博客--全部
        //     其他人--公开的
        public IList<CategoryInfo> ReadCategoriesByConditions(CategoryInfo info, int pageSize, int currentPage )
        {
            if (null == info) { info = new CategoryInfo(); }
            info.IsPublished = true;

            // 权限判断
            if (0 == info.BlogId)
            {
                // 如果是登录用户,并且没有提交要访问的BlogId,那么默认访问自己的Blog
                // 非登录用户在这一步会抛出异常
                info.BlogId = int.Parse(SecurityUtility.UserId);
                info.IsPublished = false;
            }
            
            return _This.ReadCategoriesByConditions(info,pageSize,currentPage);
        }
        
        // Count
        public int ReadCategoriesCountByConditions( CategoryInfo info )
        {
            throw new SecurityException( "此方法不许要安全认证，请直接访问服务类。" );
            //return _This.ReadCategoriesCountByConditions( info );
        }
        
        #endregion 
        
        #region Private Member
        private ICategory _This = null;
        #endregion
        
        //================================
        // 上面是自动生成的代码,下面是手工编写的代码
        //================================        
    }
}
    